# coding:utf8
import pickle
import base64
from django_redis import get_redis_connection


# 将cookie数据合并到redis中
def merge_cart_cookie_to_redis(request, user, response):
    """
    将cookie数据合并到redis中
    1.数据以cookie为准,redis的数据全部删除
    2.数据以redis为准,如果cookie中包含redis没有的商品id,则将cookie中的商品id添加到redis中
                    如果cookie中含有redis也有的商品合并时商品个数以cookie为准

    1.读取到cookie数据
    2.读取redis数据(旧的redis数据)
    3.对cookie数据进行遍历,然后将数据添加到新的redis数据中
    4.再把新的redis数据保存到redis中
    """""
    # 1.读取到cookie数据
    cookie_str = request.COOKIES.get('cart')
    if cookie_str:
        cookie_cart = pickle.loads(base64.b64decode(cookie_str.encode()))
        # 2.读取redis数据(旧的redis数据)
        # 2.1 连接redis
        redis_conn = get_redis_connection('cart')
        # 2.2 得到redis数据
        redis_cart = redis_conn.hgetall('cart_%s' % user.id)
        redis_selected_ids = redis_conn.smembers('cart_selected_%s' % user.id)
        # 2.3 redis的数据是bytes类型,需要转换
        cart = {}
        for sku_id, count in redis_cart.items():
            cart[int(sku_id)] = int(count)

        ids_list = []
        for sku_id in redis_selected_ids:
            ids_list.append(int(sku_id))
        # 3.对cookie数据进行遍历,然后将数据添加到新的redis数据中
        for sku_id, count_selected_dict in cookie_cart.items():
            cart[sku_id] = count_selected_dict['count']

            # 处理勾选状态
            if count_selected_dict['selected']:
                ids_list.append(sku_id)
        # 4.再把新的redis数据保存到redis中
        # cart
        redis_conn.hmset('cart_%s' % user.id, cart)
        # ids_list
        redis_conn.sadd('cart_selected_%s' % user.id, *ids_list)

        # redis数据合并完成之后,清除cookie数据
        # response.delete('cart')
        return response
    else:
        return response